package be.ipl.finito.usecasesImpl;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.ejb.Startup;

import be.ipl.finito.dao.CaseDao;
import be.ipl.finito.dao.JoueurDao;
import be.ipl.finito.dao.PlateauDao;
import be.ipl.finito.domaine.Joueur;
import be.ipl.finito.domaine.Joueur.Builder;
import be.ipl.finito.domaine.Partie;
import be.ipl.finito.domaine.Plateau;
import be.ipl.finito.exceptions.ConnexionImpossibleException;
import be.ipl.finito.exceptions.InscriptionImpossibleException;
import be.ipl.finito.usecases.GestionJoueur;
import be.ipl.finito.util.Util;

@Singleton
@Startup
public class GestionJoueurImpl implements GestionJoueur {

	@EJB
	JoueurDao joueurDao;
	@EJB
	PlateauDao plateauDao;
	@EJB
	CaseDao caseDao;


	@Override
	public Joueur inscrire(String login, String mdp, String nom, String prenom,
			String email) throws InscriptionImpossibleException {
		Util.checkString(login, "Le login");
		Util.checkString(mdp, "Le mot de passe");

		Builder b = new Joueur.Builder(login, mdp);

		if (nom != null) {
			b.nom(nom);
		}
		if (prenom != null) {
			b.prenom(prenom);
		}
		if (email != null) {
			b.email(email);
		}
		Joueur j = b.build();
		j = joueurDao.inscrire(j);
		if (j == null)
			throw new InscriptionImpossibleException(
					"Ce login est deja utilise, veuillez en choisir un autre.");
		else
			return j;
	}

	@Override
	public Joueur connecter(String login, String mdp)
			throws ConnexionImpossibleException {
		try {
			Util.checkString(login, "Le login");
			Util.checkString(mdp, "Le mot de passe");
		} catch (IllegalArgumentException e) {
			throw new ConnexionImpossibleException();
		}
		Joueur j = joueurDao.connecter(login, mdp);

		if (j == null)
			throw new ConnexionImpossibleException(
					"Erreur de login ou de mot de passe.");
		else {
			List<Plateau> plateaux = plateauDao.trouverPlateauxJoueur(j);
			j.setPlateaux(plateaux);
			return j;
		}
	}

	@Override
	@Lock(LockType.READ)
	public List<Joueur> listerJoueurs() {
		return joueurDao.lister();
	}

	@Override
	public Plateau getPlateauJoueur(Joueur joueur, Partie partie) {

		Plateau plateau = plateauDao.trouverPlateauJoueurPartie(joueur,
				partie.getNom());

		plateau.setCasesOccupees(caseDao.rechercherCasesOccupees(plateau));
		plateau.setjetonsAPoserCalculer(partie);
		return plateau;
	}

}
